﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using QuanLyKho.Server.BLL;
using QuanLyKho.Server;
using DevExpress.Xpf.Core;
using DevExpress.Xpf.Grid;
using DevExpress.Xpf.Docking;

namespace QuanLyKho
{
    /// <summary>
    /// Interaction logic for ucTienNo.xaml
    /// </summary>
    public partial class ucTienNo : UserControl
    {
        // khai bao bien
        private TienNoBLL TienNoServer;
        private List<TienNoDto> listTienNoClient;
        private List<TienNoDto> dsPhieuCapNhat;
        private TienNoDto objectTienNoClient;
        private List<PhuongThucTraNo> traNoPT;
        public ucTienNo()
        {
            InitializeComponent();
            FormLoaded();
        }

        private void FormLoaded()
        {
            TienNoServer = new TienNoBLL();
            listTienNoClient = new List<TienNoDto>();
            dsPhieuCapNhat = new List<TienNoDto>();

            traNoPT = new List<PhuongThucTraNo>();
            traNoPT.Add(new PhuongThucTraNo { ValueTN = "0", TenPTTN = "--Xin hãy chọn--" });
            traNoPT.Add(new PhuongThucTraNo {ValueTN ="1",TenPTTN= "  Trả nợ" });
            //traNoPT.Add(new PhuongThucTraNo { ValueTN = "2", TenPTTN = "  Nhập nợ" });
            cboPhuongThuc.ItemsSource = traNoPT;
            cboPhuongThuc.ValueMember = "ValueTN";
            cboPhuongThuc.DisplayMember = "TenPTTN";
            cboPhuongThuc.SelectedIndex = 0;

            GetThemMoi();
            GetListTienNo(DateTime.Now, DateTime.Now);
        }

        private void GetThemMoi()
        {
            objectTienNoClient = new TienNoDto();
            DateTime now = DateTime.Now;
            dateEditTuNgay.DateTime = new DateTime(now.Year, now.Month, 1, 0, 0, 0);
            dateEditDenNgay.DateTime = new DateTime(now.Year, now.Month, new DateTime(now.Year, now.Month,1).AddMonths(1).AddDays(-1).Day, 23, 59, 59);
        }

        private void GetListTienNo(DateTime ? tuNgay, DateTime ? denNgay)
        {
            try
            {
                listTienNoClient = new List<TienNoDto>();
                listTienNoClient = TienNoServer.ListTienNo(tuNgay,denNgay);
                gridDsTienNo.ItemsSource = listTienNoClient;
            }
            catch (Exception)
            {
                DXMessageBox.Show("Không lấy được dữ liệu. Kết nối máy chủ bị gián đoạn.","Lỗi",MessageBoxButton.OK,MessageBoxImage.Error);
            }
        }

        private void GetListNhapNo(DateTime? tuNgay, DateTime? denNgay)
        {
            try
            {
                listTienNoClient = new List<TienNoDto>();
                listTienNoClient = TienNoServer.ListNhapNo(tuNgay, denNgay);
                gridDsTienNo.ItemsSource = listTienNoClient;
            }
            catch (Exception)
            {
                DXMessageBox.Show("Không lấy được dữ liệu. Kết nối máy chủ bị gián đoạn.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private bool CheckThongTinDauVao()
        {
            if(dateEditTuNgay.DateTime > dateEditDenNgay.DateTime)
            {
                DXMessageBox.Show("Từ ngày không được lớn hơn đến ngày.", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                return false;
            }
            return true;
        }

        private void GetDsChiTietVatTuPhieuNhap(TienNoDto objectTemple)
        {
            try
            {
                List<PhieuNhapThuocChiTiet> listPhieuNhapThuocChiTiet = new List<PhieuNhapThuocChiTiet>();
                listPhieuNhapThuocChiTiet = TienNoServer.ListPhieuNhapThuocChiTiet(objectTemple.IdPhieuNhap.Value);
                if (listPhieuNhapThuocChiTiet != null && listPhieuNhapThuocChiTiet.Count > 0)
                {
                    gridDsChiTietTienNoVatTu.ItemsSource = listPhieuNhapThuocChiTiet;
                }
                else
                {
                    DXMessageBox.Show("Phiếu nhập này không có danh sách vật tư kèm theo.", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                    gridDsChiTietTienNoVatTu.ItemsSource = null;
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Không lấy được dữ liệu. Kết nối máy chủ bị gián đoạn.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void btnLuu_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
        {
            try
            {
                string strValue = "";
                PhuongThucTraNo phuongThucTraNoNan = (cboPhuongThuc.EditValue == null ? cboPhuongThuc.SelectedItem : cboPhuongThuc.EditValue) as PhuongThucTraNo;

                if (phuongThucTraNoNan == null)
                {
                    strValue = (string)cboPhuongThuc.EditValue;
                }
                else
                {
                    strValue = phuongThucTraNoNan.ValueTN;
                }


                if (strValue.Equals("2"))
                {
                    List<TienNoDto> listSaveServer = new List<TienNoDto>();
                    if (dsPhieuCapNhat == null || dsPhieuCapNhat.Count <= 0)
                    {
                        DXMessageBox.Show("Xin chọn danh sách dữ liệu cần nhập nợ.", "Chú ý", MessageBoxButton.OK, MessageBoxImage.Warning);
                        return;
                    }
                    listSaveServer=TienNoServer.AddNewListTienNo(dsPhieuCapNhat);
                    if (listSaveServer == null || listSaveServer.Count <= 0)
                    {
                        DXMessageBox.Show("Thực hiện nhập nợ không thành công.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Warning);
                    }
                    else
                    {
                        DXMessageBox.Show("Thực hiện nhập nợ thành công.", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information);
                        cboPhuongThuc.SelectedIndex = 1;
                        TimKiemTheoYeuCau();
                        gridDsChiTietTienNoVatTu.RefreshData();
                        dsPhieuCapNhat = new List<TienNoDto>();
                    }
                }
                else
                {

                    if (dsPhieuCapNhat.Count <= 0)
                    {
                        DXMessageBox.Show("Chưa có sự thay đổi nào về ngày trả.", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                        return;
                    }
                    else
                    {
                        string errorLoi = "";
                        errorLoi = TienNoServer.UpdateListTienNo(dsPhieuCapNhat);
                        DXMessageBox.Show(errorLoi, "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                        dsPhieuCapNhat = new List<TienNoDto>();
                    }
                    GetListTienNo(dateEditTuNgay.DateTime, dateEditDenNgay.DateTime);
                    gridDsChiTietTienNoVatTu.ItemsSource = null;
                }               
            }
            catch (Exception)
            {
                DXMessageBox.Show("Thao tác không thành công. Kết nối máy chủ bị gián đoạn.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                GetThemMoi();
            }
        }

        private void btnHuyBo_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
        {
            try
            {
                TienNoServer = new TienNoBLL();
                listTienNoClient = new List<TienNoDto>();
                dsPhieuCapNhat = new List<TienNoDto>();
                cboPhuongThuc.SelectedIndex = 0;
                //GetListTienNo(dateEditTuNgay.DateTime,dateEditDenNgay.DateTime);
                gridDsChiTietTienNoVatTu.ItemsSource = null;
                gridDsTienNo.ItemsSource = null;
            }
            catch(Exception)
            {
            }
        }

        private void btnDong_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
        {
            try
            {
                DockLayoutManager dockLayoutManager = this.Parent as DockLayoutManager;
                BaseLayoutItem bli = dockLayoutManager.ActiveMDIItem;
                if (bli != null)
                {
                    dockLayoutManager.DockController.Close(bli);
                }
            }
            catch(Exception)
            {
            }
        }

        private void view_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            try
            {
                if (e.RightButton == MouseButtonState.Pressed) return;
                if (gridDsTienNo.View.GetRowHandleByMouseEventArgs(e) != GridControl.InvalidRowHandle
                    && gridDsTienNo.View.GetRowHandleByMouseEventArgs(e) != GridControl.AutoFilterRowHandle
                    && gridDsTienNo.View.GetRowHandleByMouseEventArgs(e) != GridControl.NewItemRowHandle)
                {
                    objectTienNoClient = (TienNoDto)gridDsTienNo.GetFocusedRow();
                    GetDsChiTietVatTuPhieuNhap(objectTienNoClient);
                }
            }
            catch
            {
            }
        }

        private void view_KeyUp(object sender, KeyEventArgs e)
        {
            try
            {
                if (e.Key == Key.Enter)
                {
                    objectTienNoClient = (TienNoDto)gridDsTienNo.GetFocusedRow();
                    GetDsChiTietVatTuPhieuNhap(objectTienNoClient);
                }
            }
            catch
            {
            }
        }

        private void btnTimTen_Click(object sender, RoutedEventArgs e)
        {
            TimKiemTheoYeuCau();
        }

        private void btnXoa_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
        {
            try
            {
                objectTienNoClient = new TienNoDto();
                objectTienNoClient = gridDsTienNo.GetFocusedRow() as TienNoDto;
                if (objectTienNoClient == null)
                {
                    return;
                }
                if (DXMessageBox.Show("Bạn muốn xóa dữ liệu nợ với nhà phân phối ?", "Thông báo", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
                {
                    if (TienNoServer.DeleteObjectTienNo(objectTienNoClient))
                    {
                        DXMessageBox.Show("Xóa dữ liệu thành công.", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information);
                    }
                    else
                    {
                        DXMessageBox.Show("Xóa dữ liệu không thành công.\nDữ liệu này đã được sử dụng.", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                    }
                    objectTienNoClient = new TienNoDto();
                    GetListTienNo(dateEditTuNgay.DateTime, dateEditDenNgay.DateTime);
                    gridDsChiTietTienNoVatTu.ItemsSource = null;
                }
            }
            catch(Exception)
            {
                DXMessageBox.Show("Thao tác không thành công. Kết nối máy chủ bị gián đoạn.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void GridColumn_Validate(object sender, GridCellValidationEventArgs e)
        {
            //try
            //{
            //    if (e.Column.FieldName == "NgayTra")
            //    {
            //        TienNoDto tienDoCapNhat = new TienNoDto();
            //        tienDoCapNhat = gridDsTienNo.GetFocusedRow() as TienNoDto;
            //        if (tienDoCapNhat.NgayTra < tienDoCapNhat.PhieuNhapThuoc.NgayNhap)
            //        {
            //            DXMessageBox.Show("Ngày trả không được nhỏ hơn ngày nhập.", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
            //            return;
            //        }
            //        if (tienDoCapNhat != null)
            //        {
            //            DsCapNhat(tienDoCapNhat);
            //        }
            //        gridDsTienNo.RefreshData();
            //    }
            //}
            //catch { }
        }

        private void DsCapNhat(TienNoDto capNhat)
        {
            bool themVao = false;
            if (dsPhieuCapNhat.Count < 0)
            {
                dsPhieuCapNhat.Add(capNhat);
            }
            else
            {
                for (int i = 0; i < dsPhieuCapNhat.Count; i++)
                {
                    if (dsPhieuCapNhat[i].IdPhieuNhap == capNhat.IdPhieuNhap)
                    {
                        dsPhieuCapNhat[i] = capNhat;
                        themVao = true;
                        break;
                    }
                }
                if (themVao == false)
                {
                    dsPhieuCapNhat.Add(capNhat);
                }
            }
        }

        private void viewgridDsTienNo_CellValueChanging(object sender, CellValueChangedEventArgs e)
        {
            try
            {
                if (e.Column.FieldName == "NgayTra")
                {
                    TienNoDto tienDoCapNhat = new TienNoDto();
                    tienDoCapNhat = gridDsTienNo.GetFocusedRow() as TienNoDto;
                    tienDoCapNhat.NgayTra = Convert.ToDateTime(Convert.ToDateTime(e.Value).ToShortDateString() + " 23:59:59");
                    if (tienDoCapNhat.NgayTra < tienDoCapNhat.PhieuNhapThuoc.NgayNhap)
                    {
                        DXMessageBox.Show("Ngày trả không được nhỏ hơn ngày nhập.", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                        return;
                    }
                    if (tienDoCapNhat != null)
                    {
                        DsCapNhat(tienDoCapNhat);
                    }
                    gridDsTienNo.RefreshData();
                }

                if (e.Column.FieldName == "LyDo")
                {
                    TienNoDto tienDoCapNhat = new TienNoDto();
                    tienDoCapNhat = gridDsTienNo.GetFocusedRow() as TienNoDto;
                    tienDoCapNhat.LyDo = (string)e.Value;
                    if (tienDoCapNhat.NgayTra < tienDoCapNhat.PhieuNhapThuoc.NgayNhap)
                    {
                        DXMessageBox.Show("Ngày trả không được nhỏ hơn ngày nhập.", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                        return;
                    }
                    if (tienDoCapNhat != null)
                    {
                        DsCapNhat(tienDoCapNhat);
                    }
                    gridDsTienNo.RefreshData();
                }

            }
            catch { }
        }

        private void TimKiemTheoYeuCau()
        {
            try
            {
                string strValue="";
                columnNgayTra.Visible = true;
                columChkNhapNo.Visible = false;
                if (CheckThongTinDauVao() == false)
                {
                    return;
                }
                PhuongThucTraNo phuongThucTraNoNan = (cboPhuongThuc.EditValue == null ? cboPhuongThuc.SelectedItem : cboPhuongThuc.EditValue) as PhuongThucTraNo;

                if (phuongThucTraNoNan == null)
                {
                    strValue = (string)cboPhuongThuc.EditValue;
                }
                else
                {
                    strValue = phuongThucTraNoNan.ValueTN;
                }

                if (strValue.Equals("2"))
                {
                    columnNgayTra.Visible = false;
                    columChkNhapNo.Visible = true;
                    GetListNhapNo(dateEditTuNgay.DateTime, dateEditDenNgay.DateTime);
                }

                if (strValue.Equals("0"))
                {
                    columnNgayTra.Visible = false;
                    columChkNhapNo.Visible = false;
                    //GetListNhapNo(null, null);
                    DXMessageBox.Show("Xin hãy chọn phương thức.", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                }
                else if (strValue.Equals("1"))
                {
                    GetListTienNo(dateEditTuNgay.DateTime, dateEditDenNgay.DateTime);
                }
            }
            catch (Exception)
            {
                //DXMessageBox.Show("Thao tác không thành công. Kết nối máy chủ bị gián đoạn.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        public static DateTime GetLastDayOfMonth(int iMonth)
        {
            DateTime dtResult = new DateTime(DateTime.Now.Year, iMonth, 1);
            dtResult = dtResult.AddMonths(1);
            dtResult = dtResult.AddDays(-(dtResult.Day));
            return dtResult;
        }

        private void CheckEdit_Checked(object sender, RoutedEventArgs e)
        {
            try
            {
                TienNoDto tienDoCapNhat = new TienNoDto();
                tienDoCapNhat = gridDsTienNo.GetFocusedRow() as TienNoDto;
                if (tienDoCapNhat.NgayTra < tienDoCapNhat.PhieuNhapThuoc.NgayNhap)
                {
                    DXMessageBox.Show("Ngày trả không được nhỏ hơn ngày nhập.", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                    return;
                }
                if (tienDoCapNhat != null)
                {
                    DsCapNhat(tienDoCapNhat);
                }
                gridDsTienNo.RefreshData();
            }
            catch(Exception)
            {
            }
        }

        private void CheckEdit_Unchecked(object sender, RoutedEventArgs e)
        {
            try
            {
                TienNoDto tienDoCapNhat = new TienNoDto();
                tienDoCapNhat = gridDsTienNo.GetFocusedRow() as TienNoDto;
                if (tienDoCapNhat != null)
                {
                    if (dsPhieuCapNhat.Count < 0)
                    {
                        return;
                    }
                    else
                    {
                        for (int i = 0; i < dsPhieuCapNhat.Count; i++)
                        {
                            if (dsPhieuCapNhat[i].IdPhieuNhap == tienDoCapNhat.IdPhieuNhap)
                            {
                                dsPhieuCapNhat.Remove(tienDoCapNhat);
                                break;
                            }
                        }
                    }
                }
                gridDsTienNo.RefreshData();
            }
            catch (Exception)
            {
            }
        }

    }

    public class PhuongThucTraNo
    {
        public PhuongThucTraNo()
        {
        }
        private string valueTN;

        public string ValueTN
        {
            get { return valueTN; }
            set { valueTN = value; }
        }
        private string tenPTTN;

        public string TenPTTN
        {
            get { return tenPTTN; }
            set { tenPTTN = value; }
        }
    }
}
